葛蘭碧八法是根據移動平均線和股價之間的關係,來判斷買入,賣出
葛蘭碧八法並沒有明確指明要用哪個指標當移動平均線,短期價位,
長期價位,以下的設定是我自己設的,大家可以視自己的需求去修改,主要精神還是那八點
,突破,支撐,假跌破,反彈,跌破,阻力,假突破,反轉
簡單好用
訊號落後,急漲急跌不容易獲利,盤整多空雙巴
import backtrader as bt
import backtrader.Indicaters as btind
class RuleOfEight(bt.Strategy):
    params = (
        ('defaultSize', 1000),
        ('printLog', False),
    )
    def log(self, txt, dt = None, doPrint = False):
        if self.p.printLog or doPrint:
            dt = dt or self.data.datetime.date(0)
            print("%s %s" % (dt.isoformat(), txt))
    def __init__(self):
        self.sizer.setsizing(self.p.defaultSize)
        self.sma_half = btind.SimpleMovingAverage(self.data, period = 120)
        self.sma_long = btind.SimpleMovingAverage(self.data, period = 20)
        self.sma_short = btind.SimpleMovingAverage(self.data, period = 5)
        self.order = None
   
    def notify_order(self, order):
        if order.status in [order.Submitted, order.Accepted]:
            return
        if order.status in [order.Completed]:
            if order.isbuy():
                self.log("買入 價格: %.2f 成本: %.2f 手續費: %.2f" % (order.executed.price, order.executed.value, order.executed.comm))
            elif order.issell():
                self.log("賣出 價格: %.2f 成本: %.2f 手續費: %.2f" % (order.executed.price, order.executed.value, order.executed.comm))
        
        elif order.status in [order.Canceled, order.Margin, order.Rejected]:
            self.log("交易取消/餘額不足/拒絕交易")
            
        self.order = None
    def notify_trade(self, trade):
        if not trade.isclosed:
            return
            
        self.log("交易收益: 毛利 %.2f 淨利: %.2f" % (trade.pnl, trade.pnlcomm), doPrint = True)
    
    
    def next(self):
        if self.order:
            return
        
        # 半年線趨勢向上 (5日內的半年線比較)
        halfUp = self.sma_half[-5] < self.sma_half[0]
        # 突破
        breakThrough = (self.sma_short[-1] < self.sma_long[-1]) and (self.sma_short[0] > self.sma_long[0])
        if not self.position:
            
            if halfUp and breakThrough:
                self.order = self.buy()
                if self.order is not None:
                    self.log("買入: %.2f 股數: %d" % (self.dataclose[0], self.order.size), doPrint = True)
        else:
            if not breakThrough and not halfUp:
                self.order = self.sell()
                if self.order is not None:
                    self.log("賣出: %.2f 股數: %d" % (self.dataclose[0], self.order.size), doPrint = True)
                    
    def stop(self):
        self.log("結束收益 %.2f" % self.broker.getvalue(), doPrint = True)
永豐金證券(2890) 2018-01-01 ~ 2020-12-31
可以看到在中間有一段急跌,這個策略就沒有辦法反應過來
永豐金證券(2890) 2019-01-01 ~ 2021-10-10
這種比較平穩的就很合適,不過 2021 台股大漲,基本上要獲利應該很簡單
今天就大致介紹一下一個簡單的交易策略,因為只有使用移動平均線,所以使用起來相對簡單,但是因為參數簡單,所以很難判斷遇到的狀況到底是不是合用,賠錢的機會也是蠻高的。不過有這個簡單的策略來熱身,之後可以找一些相對報酬率高的策略來使用